package cn.nawang.ebeim.api.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import cn.nawang.ebeim.api.comm.BaseController;
import cn.nawang.ebeim.api.comm.PageList;
import cn.nawang.ebeim.api.comm.Pages;
import cn.nawang.ebeim.api.comm.SearchFormParams;
import cn.nawang.ebeim.api.domain.Department;
import cn.nawang.ebeim.api.domain.User;
import cn.nawang.ebeim.api.service.DepartmentService;
import cn.nawang.ebeim.api.utils.Constant;
import cn.nawang.ebeim.api.utils.Util;

/**
 * @ClassName: DepartmentController
 * @Description: TODO
 * @author 许炜毅
 * @date 2015年8月5日 下午5:05:35
 * @version v1.0
 */
@RestController
@RequestMapping("/dept")
public class DepartmentController extends BaseController{
  private static final Logger LOG = LoggerFactory.getLogger(DepartmentController.class);
  
  @Autowired
  private DepartmentService departmentService;

  /**
   * @author 许炜毅
   * @Description 获取部门信息列表
   * @param page
   * @param customerId
   * @return PageList 
   * @date 2015年8月7日下午6:02:39
   *
   * @修改人 
   * @修改日期
   */
  @RequestMapping(value="/list",method=RequestMethod.GET)
  public PageList getDepartmentList(Pages page,HttpServletRequest request){
    LOG.debug("/list {}", page);
    //组装查询条件
    List<SearchFormParams> dtovect = new ArrayList<SearchFormParams>();
    User us = this.getUserLoginInfo(request);
    //客户编号
    String customerId = us.getCustomerId();
    if(!StringUtils.isEmpty(customerId)){
      dtovect.add(new SearchFormParams("customerId",
        customerId,"customerId",SearchFormParams.STRING_TYPE));
    }
/*    //部门名称
    String deptName = request.getParameter("deptName");
    if(!StringUtils.isEmpty(deptName)){
      dtovect.add(new SearchFormParams("name",
        deptName,"deptName",SearchFormParams.STRING_TYPE));
    }
    //上一级部门编号
    String parentId = request.getParameter("parentId");
    if(!StringUtils.isEmpty(parentId)){
      dtovect.add(new SearchFormParams("parentId",
        Integer.valueOf(parentId),"parentId",SearchFormParams.INTEGER_TYPE));
    }*/
    if(dtovect.size()>0){
        page.setSearchFormParams(dtovect.toArray(
          new SearchFormParams[dtovect.size() - 1]));
    }
    PageList pageList=departmentService.getDepartmentList(page);
    LOG.debug("getDepartmentList {}", pageList);
    return pageList;
  }
  
  /**
   * @author 许炜毅
   * @Description 新增部门
   * @param name 部门名称
   * @param parentId 上一级部门编号
   * @param customerId 客户编号
   * @return Map<String,Object> 
   * @date 2015年8月7日下午6:03:21
   *
   * @修改人 
   * @修改日期
   */
  @RequestMapping(value="/add",method=RequestMethod.POST)
  public Map<String,Object> add(Department dept,HttpServletRequest request){
    LOG.debug("/add {}", dept);
    Map<String,Object> resultMap = new HashMap<String,Object>();
    //获取登录用户信息
    User cu = getUserLoginInfo(request);
    if(Util.isBlank(dept.getName())){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "请输入部门名称。");
      return resultMap;
    }
    //客户编号
    String customerId = cu.getCustomerId();
    if(Util.isBlank(customerId)){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "参数有误。");
      return resultMap;
    }
    //判断客户下是否存在重复部门名称
    Department obj = departmentService.getDepartmentByName(dept.getName(), customerId);
    if(obj!=null){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "您要添加的部门名称已存在。");
      return resultMap;
    }
    boolean flag = departmentService.saveDept(dept,customerId,cu.getId());
    if(flag){
      resultMap.put("code", Constant.CODE_SUCCESS);
      resultMap.put("desc", "添加成功。");
    }else{
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "服务器忙，请稍后再试。");
    }
    LOG.debug("add {}", resultMap);
    return resultMap;
  }
  
  /**
   * @author 许炜毅
   * @Description 根据部门编号，获取部门对象
   * @param id
   * @return Map<String,Object> 
   * @date 2015年8月7日下午6:22:56
   *
   * @修改人 
   * @修改日期
   */
  @RequestMapping(value="/get",method=RequestMethod.GET)
  public Map<String,Object> findDeptById(int id){
    LOG.debug("/get {}", id);
    Map<String,Object> resultMap = new HashMap<String,Object>();
    Department obj = departmentService.getDepartmentById(id);
    if(obj!=null){
      resultMap.put("code", Constant.CODE_SUCCESS);
      resultMap.put("desc", "获取数据成功。");
      resultMap.put("obj", obj);
    }else{
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "很抱歉，没找到您要的数据。");
      resultMap.put("obj", null);
    }
    LOG.debug("findDeptById {}", resultMap);
    return resultMap;
  }
  
  /**
   * @author 许炜毅
   * @Description 修改部门信息
   * @param dept
   * @param request
   * @return Map<String,Object> 
   * @date 2015年8月10日下午2:24:42
   *
   * @修改人 
   * @修改日期
   */
  @RequestMapping(value="/update",method=RequestMethod.POST)
  public Map<String,Object> update(Department dept,HttpServletRequest request){
    LOG.debug("/update {}", dept);
    Map<String,Object> resultMap = new HashMap<String,Object>();
    //获取登录用户信息
    User us = getUserLoginInfo(request);
    dept.setCustomerId(us.getCustomerId());
    if(Util.isBlank(dept.getId())){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "部门编号不允许为空。");
      return resultMap;
    }
    if(Util.isBlank(dept.getName())){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "部门名称不允许为空。");
      return resultMap;
    }
    //判断数据是否存在
    Department oldObj = departmentService.getDepartmentById(dept.getId());
    if(oldObj==null){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "很抱歉，您要修改的部门信息不存在。");
    }else{
      //判断要修改的部门名称是否已存在
      Department ns = departmentService.getDepartmentByNameNotId(
        dept.getName(), dept.getId(), dept.getCustomerId());
      if(ns!=null){
        resultMap.put("code", Constant.CODE_ERROR);
        resultMap.put("desc", "很抱歉，您要修改的部门名称已存在。");
      }else{
        //修改
        boolean flag = departmentService.update(dept, oldObj, us.getId());
        if(flag){
          resultMap.put("code", Constant.CODE_SUCCESS);
          resultMap.put("desc", "修改成功。");
        }else{
          resultMap.put("code", Constant.CODE_ERROR);
          resultMap.put("desc", "服务器忙，请稍后再试。");
        }
      }
    }
    LOG.debug("update {}", resultMap);
    return resultMap;
  }
  
  /**
   * @author 许炜毅
   * @Description 删除部门
   * @param id
   * @return Map<String,Object> 
   * @date 2015年8月10日下午2:25:36
   *
   * @修改人 
   * @修改日期
   */
  @RequestMapping(value="/delete",method=RequestMethod.GET)
  public Map<String,Object> delete(int id){
    LOG.debug("/delete {}", id);
    Map<String,Object> resultMap = new HashMap<String,Object>();
    if(Util.isBlank(id)){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "参数有误。");
      return resultMap;
    }
    //验证
    Department obj = departmentService.getDepartmentById(id);
    
    if(obj==null){
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "很抱歉，您要删除的数据不存在。");
      return resultMap;
    }else{
      if(obj.getParentId()==0){
        resultMap.put("code", Constant.CODE_ERROR);
        resultMap.put("desc", "很抱歉，您要删除的部门是主部门，不能删除。");
        return resultMap;
      }
      if(obj.getHasChildren()>0){
        resultMap.put("code", Constant.CODE_ERROR);
        resultMap.put("desc", "很抱歉，您要删除的部门还有下属部门，请先删除下属部门。");
        return resultMap;
      }
    }
    //删除
    boolean flag = departmentService.delete(id);
    if(flag){
      resultMap.put("code", Constant.CODE_SUCCESS);
      resultMap.put("desc", "删除成功。");
    }else{
      resultMap.put("code", Constant.CODE_ERROR);
      resultMap.put("desc", "服务器忙，请稍后再试。");
    }
    LOG.debug("delete {}", resultMap);
    return resultMap;
  }
  
}
